package info.motteke.qjdbc.db;

import java.sql.Connection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * データベースを表します。
 *
 * @author YWak
 *
 */
public final class Database {

    /**
     * このデータベースを表すラベルです。
     */
    private final String label;

    /**
     * このデータベースで利用するSQLの生成方法です。
     */
    private final DatabaseStrategy strategy;

    /**
     * このデータベースに接続するコネクションの生成オブジェクトです。
     */
    private final ConnectionFactory factory;

    /**
     * データベースを名前から検索するためのマップです。
     */
    private static final Map<String, Database> databaseMap = Collections.synchronizedMap(new HashMap<String, Database>());

    /**
     * データベースを名前から検索します。
     * @param label
     * @return
     */
    public static Database get(String label){
        return databaseMap.get(label);
    }

    /**
     * コンストラクタです。
     * @param label
     * @param strategy
     */
    public Database(String label, DatabaseStrategy strategy, ConnectionFactory factory){
        if(label == null || strategy == null || factory == null){
            throw new IllegalArgumentException("引数はnullに出来ません。");
        }
        this.label = label;
        this.strategy = strategy;
        this.factory = factory;
    }

    public String getLabel() {
        return label;
    }

    public DatabaseStrategy getStrategy() {
        return strategy;
    }

    public Connection getConnection() {
        return factory.get();
    }

    @Override
    public boolean equals(Object obj) {
        if(!(obj instanceof Database)){
            return false;
        }
        Database db = (Database)obj;

        return label.equals(db.label) && strategy.equals(db.strategy) && factory.equals(factory);
    }

    @Override
    public int hashCode() {
        return label.hashCode() + strategy.hashCode() * 31;
    }


}
